import Vue from 'vue'
import VueRouter from 'vue-router'
import store from '@/store'
Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    // 这里路径省略了index.vue 因为默认会寻找 inex文件 .js .vue ...
    component: () => import('@/views/layout'), // 默认打开的是布局页面
    redirect: '/home', // 导致路由规则数组在再匹配
    children: [
      {
        // 侧边导航栏 点击会切换路由地址 路由地址靠数据请求回来铺设上去的
        // 所以你的路由规则要配合它保持一致
        path: 'home',
        component: () => import('@/views/home')
      },
      {
        path: 'user-info',
        component: () => import('@/views/User/userInfo.vue')
      },
      {
        path: 'user-avatar',
        component: () => import('@/views/User/userAvatar')
      },
      {
        path: 'user-pwd',
        component: () => import('@/views/User/userPwd')
      },
      {
        path: 'art-cate',
        component: () => import('@/views/article/artCate')
      },
      {
        path: 'art-list',
        component: () => import('@/views/article/artList')
      }
    ]
  },
  {
    path: '/reg',
    component: () => import('@/views/register')
    // webpack 提供import函数来路由 懒加载导入组件
    // 理由懒加载 就是页面路径切换到 /reg 才去加载对应的组件代码
    // 好处： 让首页加载文件体积更小 打开更快
  },
  {
    path: '/login',
    component: () => import('@/views/login')
  }
]
// vuex保存用户信息的思路是?
// 定义state变量和mutations以及actions方法, 在路由守卫中判断有token无vuex中userInfo用户信息的时候,
// 调用actions里的方法请求用户信息保存到state里userInfo中
const router = new VueRouter({
  routes
})
// 无需验证的token页面 白名单
const whiteList = ['/login', '/reg']
// 全局路由前置守卫 每次访问该网站都会执行一次 路由跳转的时候也会执行一次
router.beforeEach((to, from, next) => {
  // console.log(to, from)
  // console.log(1)
  const token = store.state.token
  if (token) {
    // 如果有token 则证明已登录
    if (!store.state.userInfo.username) {
      // 有token 但是没有用户信息 才去请求用户信息保存到vuex里
      // 调用actions里方法请求数据
      store.dispatch('initUserInfo')
      // 下次切换页面vuex里有用户信息数据就不会重复请求用户信息
    }
    next() // 路由放行
  } else {
    // 如果无token
    // 如果取得是白名单页面 则放行
    if (whiteList.includes(to.path)) {
      next()
    } else {
      // 如果其他页面请强制拦截并跳转到登录页面
      next('/login')
    }
  }
})

export default router
// 退出登录 重新登录 只走相关组件代码（异步dom切换 不会导致所有的代码重新执行 App.vue 不走)
// 效果不对 换个账号它得重新请求用户数据
// 解决：
// 1 可以再登录页面 登陆成功后再发起请求去拿到用户信息
// 2 可以在全局前置路由守卫中 写(路由跳转的时候 判断+获取)
